package cn.edu.scau.cmi.crawler.service;

import java.io.File;
import java.util.Calendar;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.stereotype.Service;

import cn.edu.scau.cmi.ema.controller.base.CmiEmaController;
import cn.edu.scau.cmi.ema.domain.Crawlerfile;
import cn.edu.scau.cmi.ema.util.CmiArrayUtil;
import cn.edu.scau.cmi.ema.util.CmiTimeUtil;
import cn.edu.scau.cmi.ema.util.ExcelUtil;

@Service
public class CrawlerImportServiceImpl extends CmiEmaController implements CrawlerImportService{

	protected File nonImportEventFile =null;
	protected File nonImportDetectFile =null;
	
	public List<Row> convertXlsRow2EventRows(List<Row> rawRowList) {
		// key为列数(从0开始)，分隔符集合
		Map<Integer, List<String>> map = new HashMap<>();
		map.put(3, CmiArrayUtil.array2List("、", "和", ";", "；"));// 发现地址
		map.put(4, CmiArrayUtil.array2List("、", "和", ";", "；"));// 掺假方式

		return ExcelUtil.getAllRows(rawRowList, map);
	}
	public Row getTitleRow(Sheet sheet) {
		
		Set<String> standardSet = new HashSet<String>();
		standardSet.add("编号");
		standardSet.add("序号");
		
		standardSet.add("生产企业名称");
		standardSet.add("标识生产企业名称");
		standardSet.add("标称生产企业名称");

		standardSet.add("生产企业地址");
		standardSet.add("标识生产企业地址");
		standardSet.add("标称生产企业地址");
		standardSet.add("被抽样单位名称");
		
		standardSet.add("样品名称");
		standardSet.add("产品名称");
		standardSet.add("食品名称");
		
		standardSet.add("抽查时间");
		
		

		standardSet.add("检验机构");
		standardSet.add("规格型号");
		standardSet.add("商标");
		standardSet.add("检测结果");
		standardSet.add("食品大类");
		standardSet.add("批号");
		
		
		Row titleRow = null;

		for(int rowNum = 0; rowNum < sheet.getLastRowNum(); rowNum++) {
//			包含数量，暂定如果超过3个就正确
			int containQuantity = 0;
//			TODO 有时候会出现莫名奇怪的异常，拿到空值？？？
			Row row = sheet.getRow(rowNum);
			if (row == null) {
				System.out.println("这个文件获取的标题行是空，这个文件将不被处理，可能会导致获取标题行错误，请查看该文件");
				continue;
			}
			
//			把所有的行中的cell取出
			int lastcellNum = row.getLastCellNum();
			
			for(int columnNum = 0; columnNum < lastcellNum; columnNum++) {
				String content = ExcelUtil.getCellString(row, columnNum);
				if (standardSet.contains(content)) {
					containQuantity++;
				}
//				包含数量，暂定如果超过3个就正确
				if (containQuantity > 2) {
					break;
				}
			}
//			包含数量，暂定如果超过3个就是这一行，也停止循环
			if (containQuantity > 2) {
				titleRow = sheet.getRow(rowNum);
				break;
			}
		}
		return titleRow;
	}

	
	public Workbook getWorkbook(Crawlerfile crawlerfile, String fileType) {
		Workbook workbook = null;
		String timeStamp = CmiTimeUtil.getYMDHMSString(Calendar.getInstance());
		
		String siteName=crawlerfile.getUrl().getSite().getName();
		String samrAddressName=siteName.substring(0,siteName.length()-7);
		
		System.out.println("爬取的文件所在的根目录是：" + samrDirectory);
		
		String physicFileName = samrDirectory + samrAddressName +"/" + fileType + crawlerfile.getName();
		
//		File physicFile = getPhysicFile(physicFileName);
		
		File physicFile = new  File(physicFileName);  //物理文件，实实在在的文件
		
		if(physicFile.exists()) {
			workbook = ExcelUtil.getWorkbook(physicFileName);
		}
		
		nonImportDetectFile = new File(samrDirectory + samrAddressName +"/" + samrNonImportDetect +crawlerfile.getName().replace(".xlsx", "-检测导入异常-" + timeStamp + ".xlsx"));
		
		return workbook;
	}

}
